#include <iostream>
#include <SFML/Graphics.hpp>
#include "../../include/GUI/Layer.hpp"

using namespace std;

namespace GUI
{
    Layer::Layer(Engine &Moteur) : Widget(Moteur)
    {
        // Initialisation...
    }

    void Layer::SetWidget(Widget *widget)
    {
        m_widgets.push_back(widget);
        m_widgets.back()->SetParent(this);
    }
    void Layer::SetFocus(const int i)
    {
        Widget *focus = m_widgets[i];

        for(int j=i;j < m_widgets.size() and j>=0; j++)
        {
            m_widgets[j] = m_widgets[j+1];
        }

        m_widgets[m_widgets.size()-1] = focus;
    }

    void Layer::OpenWidget(Widget *widget)
    {
        for(int i=0;i<m_widgets.size() and i >=-1;i++)
        {
            if(widget == m_widgets[i])
            {
                SetFocus(i);
                i = -2;
            }
        }
    }
    void Layer::CloseWidget(Widget *widget)
    {
        int index = 0;

        for(int i=0;i<m_widgets.size() and i >=-1;i++)
        {
            if(widget == m_widgets[i])
            {
                index = i;
                i = -2;
            }
        }

        for(int i=index-1;i>=0;i--)
        {
            m_widgets[i+1] = m_widgets[i];
        }
        m_widgets[0] = widget;
    }

    void Layer::UpdateEvent()
    {
        // On donne le focus au nouvel objet lors d'un clique
        if(m_Moteur.Event()->Type == sf::Event::MouseButtonPressed and !m_widgets[m_widgets.size()-1]->IsMove())
        {
            for(int i=m_widgets.size()-1;i < m_widgets.size() and i !=-1  and i >= 0;i--) // Si i = -1 alors un objet a le curseur sur lui, on arrête donc la boucle
            {
                if(m_widgets[i]->IsHover() and !m_widgets[m_widgets.size()-1]->IsHover() and m_widgets[i]->IsOpen())
                {
                    SetFocus(i);
                    i = 0;
                }
            }
        }

        if(m_widgets[m_widgets.size()-1]->IsOpen())
            m_widgets[m_widgets.size()-1]->UpdateEvent(); // On actualise les évènements de l'objet qui a le focus (l'objet au premier plan)
        // On update ensuite les évènements de l'objet qui possède éventuellement le curseur, sans avoir le focus
        for(int i=m_widgets.size()-1;i < m_widgets.size() and i !=-1  and i >= 0;i--) // Si i = -1 alors un objet a le curseur sur lui, on arrête donc la boucle
        {
            if(m_widgets[i]->IsHover() and !m_widgets[m_widgets.size()-1]->IsHover() and !m_widgets[m_widgets.size()-1]->IsMove() and m_widgets[i]->IsOpen())
            {
                m_widgets[i]->UpdateEvent();
                i = 0;
            }
        }
    }

    void Layer::Afficher()
    {
        for(int i=0;i < m_widgets.size();i++)
        {
            m_widgets[i]->Afficher();
        }
    }
}
